package org.lora.core.mongodb;

import java.util.List;

import org.bson.Document;
import org.bson.conversions.Bson;
import org.lora.exception.LoraCoreException;
import org.lora.exception.MongoDBException;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

/**
 * 连接MongoDB数据库的DAO接口
 * 
 * @author 与龙共舞
 *
 */
public interface IMongoDAO {

	/**
	 * 
	 * 根据 数据库名和 数据库集合名 获取MongoCollection集合
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @return
	 */
	public MongoCollection<Document> getMongoCollection(String dbName, String collectionName) throws LoraCoreException;

	/**
	 * 
	 * 向指定数据库名和 数据库集合名 中插入文档集合 如果documentList为空 则什么都不做（不会抛出异常）
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param documentList
	 *            文档集合
	 * @throws MongoDBException
	 */
	public void insert(String dbName, String collectionName, List<Document> documentList) throws LoraCoreException;

	/**
	 * 删除数据库dbName中，指定collectionName中 指定key和相应value的值
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param keys
	 * @param values
	 * @return
	 */
	public DeleteResult delete(String dbName, String collectionName, String key, String value) throws LoraCoreException;

	/**
	 * 删除数据库dbName中，指定collectionName中 指定key和相应value的值
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param bson
	 * @return
	 * @throws MongoDBException
	 */
	public DeleteResult delete(String dbName, String collectionName, Bson bson) throws LoraCoreException;

	/**
	 * 查询
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param keys
	 * @param values
	 * @param num
	 * @return
	 */
	public List<Document> find(String dbName, String collectionName, String key, String value) throws LoraCoreException;

	/**
	 * 更新
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param paramEntity
	 * @param updateEntity
	 * @return
	 * @throws MongoDBException
	 */
	public UpdateResult update(String dbName, String collectionName, MongoParamEntity paramEntity, MongoParamEntity updateEntity)
			throws LoraCoreException;

	/**
	 * 更新
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param paramBson
	 * @param updateBson
	 * @return
	 * @throws MongoDBException
	 */
	public UpdateResult update(String dbName, String collectionName, Bson paramBson, Bson updateBson) throws LoraCoreException;

	/**
	 * 查询
	 * 
	 * @param dbName
	 *            数据库名
	 * @param collectionName
	 *            数据库集合名
	 * @param bson
	 * @return
	 * @throws MongoDBException
	 */
	public List<Document> find(String dbName, String collectionName, Bson bson) throws LoraCoreException;

}
